package work.thread_eg.concurrent.lock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * LockSupport
 * 实现当前线程阻塞 （一般用的是锁) 叫醒线程继续执行（一般用的notify）
 *
 * park() 调用UnSafe类的park()方法 C++实现的
 *
 */
public class LockSupportTest01 {
    public static void main(String[] args) {

        Thread thread = new Thread(()->{
            for(int i=0;i<10;i++) {
                System.out.println(i);
                // 第5秒的时候副线程阻塞
                if(i==5) {
                    LockSupport.park();
                }
                if(i==6) {
                    LockSupport.park();
                }
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();

        // unpark可以先于park执行 而且之后第一次park就无效了 第二次park就可以阻塞了
        LockSupport.unpark(thread);

        try {
            TimeUnit.SECONDS.sleep(8);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("after 8 seconds!");
        // 主线程第8秒的时候 解封副线程 这时候副线程继续执行
        // unpark方法需要指定某个线程
        LockSupport.unpark(thread);

    }
}
